package com.nowcoder.community.controller;

import com.nowcoder.community.entity.DiscussPost;
import com.nowcoder.community.entity.Page;
import com.nowcoder.community.entity.User;
import com.nowcoder.community.service.DiscussPostService;
import com.nowcoder.community.service.LikeService;
import com.nowcoder.community.service.UserService;
import com.nowcoder.community.util.CommunityConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @BelongsProject: community
 * @BelongsPackage: com.nowcoder.community.controller
 * @Author: Master_XXJS
 * @CreateTime: 2022-09-17  09:29
 * @Description: TODO 访问首页，以及首页的分页，导航等功能
 * @Version: 1.0
 */
@Controller
@Slf4j
public class HomeController implements CommunityConstant {

    @Autowired
    private UserService userService;
    @Autowired
    private DiscussPostService  discussPostService;
    @Autowired
    private LikeService likeService;

    /**
     * 帖子的列表，首页默认最新，还有热门排行
     * @param model
     * @param page
     * @param orderMode 最新（默认 0），热门（1）
     *                  如果 orderMode 前端没有传参数的话，默认值为 0
     * @return
     */
    @RequestMapping (value = "/index",method = RequestMethod.GET)
    public String getIndexPage(Model model, Page page,
                               @RequestParam(name = "orderMode",defaultValue = "0") int orderMode){
        //日志调试
        log.info("访问牛客首页");

        // 方法调用栈，springmvc 会自动的实例化 Model 和 page 对象，将 page 注入到model对象中，不然需要调用 model.addAttribute
        // 所以，在 前端的 thymeleaf 中可以访问到Page对象的数据（用小写 page）
        // 其实所有的 entity 实体类都会自动的注入到 Model 模型中（需要 thymeleaf 模板引擎）
        page.setRows(discussPostService.findDiscussPostRows(0));
        page.setPath("/index?orderMode=" + orderMode);

        //获取 文章的 列表
        List<DiscussPost> list = discussPostService.findDiscussPosts(0, page.getOffset(), page.getLimit(),orderMode);
        //建立一个 list集合（map） 或者 自己创建一个新的实体类 DTO 进行存放 user 和 discusspost文章 的数据
        List<Map<String, Object>> discussPosts = new ArrayList<>();

        //判断是否有数据
        if (list != null){
            //进行对  list 列表遍历，存放到 map集合中，因为没有一个实体类 共有discussPost 和 user
            for (DiscussPost post : list) {
                // 使用 map集合，进行存储，一个 key 可以对应多个 value 的特性，方便
                Map<String,Object> map = new HashMap<>();
                map.put("post",post);
                User user = userService.findUserById(post.getUserId());
                map.put("user",user);

                //获取帖子的 点赞数量
                long entityLikeCount = likeService.findEntityLikeCount(ENTITY_TYPE_POST, post.getId());
                map.put("likeCount",entityLikeCount);

                discussPosts.add(map);
            }
        }

        // 将 上面的 list（存储了 user 和 discussPost 的信息的map）返回到 view 层（前端可以获取）
        model.addAttribute("discussPosts",discussPosts);
        model.addAttribute("orderMode",orderMode);

        //返回跳转的网址
        //这里运用了 thymeleaf 模板引擎，默认到 resources 的 templates 文件路径下查找路径
        // 所以下面返回的路径只能是  在 templates 文件下
        /* 不然报错  Error resolving template [/resources/index.html], template might
            not exist or might not be accessible by any of the configured Template Resolver
         */
        //这里可以要  /  也可以不要 /
        return "/index.html";
    }

    @RequestMapping(path = "/error", method = RequestMethod.GET)
    public String getErrorPage() {
        //因为404的话，路径根本不存在， 所以无法访问到 controller，也就是controller不可能报错，所以无法触发这里
        //触发了这个的异常的 状态码 就一定不是 404
        return "/error/500";
    }

    //没有权限
    @RequestMapping(path = "/denied", method = RequestMethod.GET)
    public String getDeniedPage() {
        return "/error/404";
    }
}

